#ifndef BASECONSTRUITREPRESENTATION_HPP
#define BASECONSTRUITREPRESENTATION_HPP

#include <QtCore/QObject>
#include <QtCore/QString>

class TraitementRequete;
class StructureDonnees;

/** Classe mère qui réalise la construction d'objets héritant de BaseXmlInfo.
  * Cette classe abstraite sert de base aux classes qui construisent des
  * instances dérivées de BaseXmlInfo à partir du contenu d'un fichier XML
  * obtenu par l'API croquemonster.
  *
  * La classe possède une instance de TraitementRequete, qui est responsable de
  * télécharger le fichier, l'interpréter correctement et de récupérer les
  * données dans une instance de \c StructureDonnees.
  *
  * @author Johan "Solo" Luisier
  * @date Novembre 2011
  */
class BaseConstruitRepresentation : public QObject
{
  Q_OBJECT
public:
  /** Constructeur.
   * Le constructeur initialise les membres de la classe.
   *
   * @param[in] agence nom de l'agence
   * @param[in] mdp mot de passe API
   * @param[in] contenu "type" de contenu désiré ("agency", "contracts", ...).
   * @param parent pointeur sur le QObject parent.
   */
  BaseConstruitRepresentation( const QString& agence, const QString& mdp,
			       const QString& contenu, QObject* parent = 0 );
  /** Destructeur.
   * Le destructeur ne fait rien de spécial.
   */
  virtual ~BaseConstruitRepresentation();
  /** Méthode qui effectue le traitement des données.
   * Les données sont téléchargées, interprétées et récupérées dans une instance
   * de \c StructureDonnees.
   *
   * @param[in] nomSyndicat ce paramètre est optionnel, et sert uniquement lors
   * de la récupération d'informations sur le syndicat auquel l'agence
   * appartient.
   */
  virtual void chargeInformations( const QString& nomSyndicat = QString() ) = 0;
  /** Permet d'accéder à Contenu.
   *
   * @return une référence constante sur Contenu.
   */
  const QString& contenu() const;
  /** Permet de changer la valeur de Contenu.
   *
   * @param contenu nouvelle valeur de Contenu.
   */
  void setContenu( const QString& contenu );
  /** Permet d'accéder à Agence.
   *
   * @return une référence constante sur Agence.
   */
  const QString& agence() const;
  /** Permet de changer la valeur de Agence.
   *
   * @param agence nouvelle valeur de Agence.
   */
  void setAgence( const QString& agence );
  /** Permet d'accéder à MotDePasse.
   *
   * @return une référence constante sur MotDePasse.
   */
  const QString& motDePasse() const;
  /** Permet de changer la valeur de MotDePasse.
   *
   * @param motDePasse nouvelle valeur de MotDePasse.
   */
  void setMotDePasse( const QString& motDePasse );
protected:
  /** "Type" de contenu.
   * Le type de contenu est en fait le nom du fichier XML téléchargé par le
   * biais de l'API. Les valeurs possibles sont "agency", "syndicate", "items",
   * "warlog", "monsters", "portails", "contracts", "inventory", "cities".
   */
  QString Contenu;
  /** Nom de l'agence.
   */
  QString Agence;
  /** Mot de pass API de l'agence.
   */
  QString MotDePasse;
  /** Instance de \c TraitementRequete qui effectue le téléchargement et procède
   * à l'interprétation du fichier reçu.
   */
  TraitementRequete * RecuperateurContenu;
signals:
  /** Signal envoyé une fois les informations reçues et correctement traitées.
    */
  void infosPretes();
protected slots:
  /** Slot virtuel pur, qui est à connecté au signal infosPretes(),
    * l'implémentation dans chaque classe dérivée doit faire suivre l'appel à
    * une méthode propre à cette classe.
    *
    * @param[in] infos pointeur sur le conteneur des informations récupérées
    * depuis le fichier téléchargé.
    */
  virtual void construitInfoInstance( const StructureDonnees* infos ) = 0;
};

#endif // BASECONSTRUITREPRESENTATION_HPP
